package com.jfx.week1._02_stage_scene_node;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

/**
 * Stage(窗口)
 * 通常对应于一个窗口，JavaFX桌面应用程序，可以打开多个窗口，
 * 每个窗口都有其自己的Stage,如果需要打开其他窗口
 * JavaFX可以创建其他对象。例如，用于对话框，向导等。
 *
 * <p>
 * 主要内容
 * 1.为窗口设置布局
 * 2.设置窗口属性
 * 3.生命周期监听
 * 4.监听键盘
 * 5.新开一个Stage
 */
public class Stage_ extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        /*
         *1.为窗口设置布局
         */
        VBox vBox = new VBox(new Label("第1个标签"), new Label("第2个标签"), new Label("第3个标签"));
        Scene scene = new Scene(vBox);
        primaryStage.setScene(scene);


        /*
         *2.设置窗口属性
         * setTitle 窗口标题
         * setX，setY 窗口坐标，左上角为中心,向右为X轴正坐标,向下为Y轴正坐标
         * setWidth，setHeight 窗口宽高
         * setFullScreen 设置全屏
         *
         * initStyle 窗口风格
         *      DECORATED 有 标题栏、最小化、最大化、关闭按钮，白色背景的标准窗口。
         *      UNDECORATED 没有 标题栏、最小化、最大化、关闭按钮，白色背景
         *      TRANSPARENT 没有 标题栏、最小化、最大化、关闭按钮，白色背景
         *      UNIFIED  只是在装饰区域和主要内容区域之间没有边界。
         *      UTILITY 实用程序Stage是经过装饰的窗口，没有 标题栏、最小化、最大化。
         */
        primaryStage.setTitle("主Stage");
        primaryStage.setX(0);
        primaryStage.setY(0);
        primaryStage.setWidth(400);
        primaryStage.setHeight(400);
        //primaryStage.setFullScreen(true);
        primaryStage.initStyle(StageStyle.DECORATED);



        /*
         * 3.生命周期监听
         * init 初始化完成
         * Showing 正在显示
         * Shown 显示完成
         * Hiding 正在隐藏
         * Hidden 隐藏完成
         * stop 彻底退出
         *
         */
        primaryStage.setOnHiding((event) -> {
            System.out.println("生命周期监听---正在隐藏---OnHiding ");
        });

        primaryStage.setOnHidden((event) -> {
            System.out.println("生命周期监听---隐藏完成---OnHidden ");
        });

        primaryStage.setOnShowing((event) -> {
            System.out.println("生命周期监听---正在显示---OnShowing ");
        });

        primaryStage.setOnShown((event) -> {
            System.out.println("生命周期监听---显示完成---OnShown ");
        });
        primaryStage.show();



        /*
         *4.键盘监听
         * 键盘监听--当前Stage获得焦点时侦听键盘
         * 监听ESC实现退出
         */
        primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> {
            System.out.println("event.toString(): " + event.toString());
            System.out.println("event.getCode(): " + event.getCode());

            switch (event.getCode().name()) {

                //ESC
                case "ESCAPE": {
                    primaryStage.close();
                    break;
                }

                default: {
                    System.out.println("Unrecognized key");
                }
            }
        });


        /*
         *5.新开另一个Stage
         * 设置非主窗口的模式--Modality
         * 窗口模式只能设置在 非主Stage对象
         * 否则出现异常：Caused by: java.lang.IllegalStateException: Cannot set modality for the primary stage
         */
        //Stage otherStage = new Stage();
        //otherStage.setTitle("非主Stage对象");
        //Modality.WINDOW_MODAL--不用必须关闭
        //Modality.NONE--普通窗口
        //Modality.APPLICATION_MODAL--必须关闭
        //otherStage.initModality(Modality.APPLICATION_MODAL);//

        //otherStage.initModality();//
        //otherStage.initModality();//
        //otherStage.setWidth(500);
        //otherStage.setHeight(200);
        //otherStage.setX(200);
        //otherStage.setY(200);
        //otherStage.show();

    }

    @Override
    public void init() throws Exception {
        System.out.println("生命周期监听---初始化完成---init");
    }

    @Override
    public void stop() throws Exception {
        System.out.println("生命周期监听---程序已经停止---stop");
    }
}
